home *** CD-ROM | disk | FTP | other *** search
- // SetupTape.c
- // 24 Aug 1996 14:40:53
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include "SetupTape.h"
- #include "Backup_proto.h"
- #include "TapeDrive.h"
- #include "BackupStrings.h"
-
-
- #define d(x) ;
-
-
- #define DEVICENAME_SIZE 40
- #define DEFAULT_BUFMEMTYPE (MEMF_24BITDMA | MEMF_PUBLIC)
- #define DEFAULT_TAPENAME "TAPE"
- #define TESTBLOCK_COUNT 200
-
-
- static void STRender(ULONG ScaleX, ULONG ScaleY, UWORD OffsetX, UWORD OffsetY);
- static int OpenSTWindow(struct Window *Parent);
- void CloseSTWindow( void );
- static int HandleSTMsg(void);
- static void __interrupt HandleSTGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code);
- static void HandleSTGadget(struct Gadget *Gad, USHORT code);
- static void UseSTData(struct DiskFlags *Dsk);
- static void ScanSCSI(struct DiskFlags *Dsk);
- static void CheckTapeDrive(struct DiskFlags *Dsk);
- static void ClearTapeDrive(void);
- static void TestDrive(struct DiskFlags *Dsk);
- static void SetPropertyGadgets(const struct TapeFlags *Prop);
- static void STMessageText(const char *Text, ULONG MsgID, ...);
- static char *DecodeTapeError(struct DiskFlags *Dsk, char *Line);
- static BOOL DoTestTapeDrive(struct DiskFlags *Dsk);
- static long TestQFAAppend(struct DiskFlags *Dsk, unsigned char *DataBlock);
- static BOOL CreateMountFile(struct DiskFlags *Dsk);
- static BOOL WriteMountList(FILE *fd, const struct DiskFlags *Dsk);
- static BOOL MountTapeDrive(struct DiskFlags *Dsk);
- static void FindDsk(const char *Device, short Unit);
-
-
- extern struct ExecBase *SysBase;
-
- // aus Backup_Window.c
- extern APTR vi; // VisualInfo
- extern struct Screen *WBScreen;
-
- // Variable aus Backup.c
- extern struct DiskFlags __far *Disks;
- extern unsigned short NDisk; // Anzahl Einträge in Disks[]
- extern struct TextFont *myFont, *ScreenFont;
-
- // aus FileSelect.c
- extern struct Window *activeWindow; // das gerade aktive Backup-Window
- extern BOOL HelpActive; // Online-Hilfe ist aktiv
- extern BOOL GadgetHelp; // V39-GadgetHelp ist verfügbar
- extern ULONG BackupHelpGroup; // Help Group
-
- // aus Backup_Options.c / Backup_OptionsGadgets.h
- extern struct GenericGadgetImages GetFileGadgetImage;
-
-
- static struct BInputHandler *STInput = NULL;
-
- static struct GadgetShort *STGadgetShort; // Tabelle für Tasten-Kürzel
-
- static MINLIST(STResourceList);
-
- static struct Window *STWnd = NULL;
- static struct Gadget *STGList = NULL;
- static struct Gadget *STGadgets[ST_CNT];
- static UWORD STLeft = 119;
- static UWORD STTop = 75;
- static UWORD STWidth = 503;
- static UWORD STHeight = 249;
-
- static BOOL CreateProtocol = TRUE;
-
- static char ProductName[16+1];
- static char VendorName[8+1];
- static char RevisionName[4+1];
-
- static struct Hook STGadgetShortHook =
- {
- { NULL },
- HookEntry,
- (ULONG (*)()) HandleSTGadgetCallback,
- NULL,
- };
-
- static struct DiskFlags TapeDsk =
- {
- NULL, NULL,
- { 0 },
- "",
- "scsi.device",
- 0,
- };
-
- static BOOL TapeDskOk = FALSE;
-
- static char TapeDriveNames[8][40];
- static struct Node TapeDriveNodes[8];
- static struct MinList TapeDriveList;
- static short TapeDriveListCount;
-
- static UWORD STGTypes[] =
- {
- GENERIC_KIND,
- BUTTON_KIND,
- BUTTON_KIND,
- BUTTON_KIND,
- STRING_KIND,
- TEXT_KIND,
- TEXT_KIND,
- BUTTON_KIND,
- BUTTON_KIND,
- TEXT_KIND,
- BUTTON_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- LISTVIEW_KIND,
- TEXT_KIND,
- CHECKBOX_KIND,
- CHECKBOX_KIND,
- BUTTON_KIND,
- STRING_KIND,
- };
-
- static struct NewGadget STNGad[] =
- {
- 12, 7, 24, 19, (UBYTE *) &GetFileGadgetImage, NULL, GD_STDeviceFile, 0, NULL, NULL,
- 406, 215, 73, 19, (UBYTE *) MSG_STCANCEL_GAD, NULL, GD_STCancel, PLACETEXT_IN, NULL, NULL,
- 308, 215, 73, 19, (UBYTE *) MSG_STUSE_GAD, NULL, GD_STUse, PLACETEXT_IN, NULL, NULL,
- 12, 35, 174, 19, (UBYTE *) MSG_SCANSCSI_GAD, NULL, GD_STScanSCSI, PLACETEXT_IN, NULL, NULL,
- 37, 8, 147, 17, NULL, NULL, GD_STDeviceName, 0, NULL, NULL,
- 98, 81, 118, 16, (UBYTE *) MSG_MODEL_GAD, NULL, GD_STModel, PLACETEXT_LEFT, NULL, NULL,
- 98, 100, 118, 16, (UBYTE *) MSG_REVISION_GAD, NULL, GD_STRevision, PLACETEXT_LEFT, NULL, NULL,
- 4, 194, 174, 19, (UBYTE *) MSG_GENMOUNT_GAD, NULL, GD_STCreateMount, PLACETEXT_IN, NULL, NULL,
- 4, 216, 174, 19, (UBYTE *) MSG_MOUNT_GAD, NULL, GD_STMount, PLACETEXT_IN, NULL, NULL,
- 98, 119, 118, 16, (UBYTE *) MSG_VENDOR_GAD, NULL, GD_STVendor, PLACETEXT_LEFT, NULL, NULL,
- 3, 172, 174, 19, (UBYTE *) MSG_TESTDRIVE_GAD, NULL, GD_STTestDrive, PLACETEXT_IN, NULL, NULL,
- 225, 78, 26, 11, (UBYTE *) MSG_SCSI2_GAD, NULL, GD_STSCSI2, PLACETEXT_RIGHT, NULL, NULL,
- 225, 90, 26, 11, (UBYTE *) MSG_QFA_GAD, NULL, GD_STQFA, PLACETEXT_RIGHT, NULL, NULL,
- 225, 102, 26, 11, (UBYTE *) MSG_FASTSPACE_GAD, NULL, GD_STFastSpace, PLACETEXT_RIGHT, NULL, NULL,
- 225, 114, 26, 11, (UBYTE *) MSG_LOCATE_GAD, NULL, GD_STLocate, PLACETEXT_RIGHT, NULL, NULL,
- 225, 126, 26, 11, (UBYTE *) MSG_SPACEBACK_GAD, NULL, GD_STSpaceBack, PLACETEXT_RIGHT, NULL, NULL,
- 359, 78, 26, 11, (UBYTE *) MSG_PAGEFORMAT_GAD, NULL, GD_STPageFormat, PLACETEXT_RIGHT, NULL, NULL,
- 359, 90, 26, 11, (UBYTE *) MSG_INVEOT_GAD, NULL, GD_STInvertEOT, PLACETEXT_RIGHT, NULL, NULL,
- 359, 102, 26, 11, (UBYTE *) MSG_ERASELONG_GAD, NULL, GD_STEraseLong, PLACETEXT_RIGHT, NULL, NULL,
- 359, 114, 26, 11, (UBYTE *) MSG_QFAAPPEND_GAD, NULL, GD_STQFAAppend, PLACETEXT_RIGHT, NULL, NULL,
- 198, 5, 288, 66, NULL, NULL, GD_STTapeDrives, 0, NULL, NULL,
- 4, 151, 491, 16, NULL, NULL, GD_STMessages, PLACETEXT_LEFT, NULL, NULL,
- 257, 172, 26, 11, (UBYTE*) MSG_CREATEPROT_GAD, NULL, GD_STCreateProtocol, PLACETEXT_RIGHT, NULL, NULL,
- 359, 126, 26, 11, (UBYTE*) MSG_SPACEEOR_GAD, NULL, GD_STSpaceEOR, PLACETEXT_RIGHT, NULL, NULL,
- 203, 215, 86, 20, (UBYTE*) MSG_STOP_GAD, NULL, GD_STAbort, PLACETEXT_IN, NULL, NULL,
- 256, 189, 86, 17, (UBYTE*) MSG_STTAPENAME_GAD, NULL, GD_STTapeName, PLACETEXT_RIGHT, NULL, NULL,
- };
-
- static ULONG STGTags[] =
- {
- (TAG_DONE),
- (GT_Underscore), '_', (TAG_DONE),
- (GT_Underscore), '_', GA_Disabled, TRUE, (TAG_DONE),
- (GT_Underscore), '_', (TAG_DONE),
- (STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 50, (TAG_DONE),
- (GTTX_Border), TRUE, (TAG_DONE),
- (GTTX_Border), TRUE, (TAG_DONE),
- (GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
- (GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
- (GTTX_Border), TRUE, (TAG_DONE),
- (GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_DONE),
- (GTLV_ShowSelected), NULL, (TAG_DONE),
- (GTTX_Text), 0,
- (GTTX_Border), TRUE,
- GTTX_Justification, GTJ_CENTER,
- GTTX_Clipped, TRUE,
- (TAG_END),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_END),
- GTCB_Scaled, TRUE,
- (GT_Underscore), '_',
- (TAG_END),
- (GT_Underscore), '_',
- GA_Disabled, TRUE,
- (TAG_END),
- (GTST_String), (ULONG) DEFAULT_TAPENAME,
- (GTST_MaxChars), 10,
- (STRINGA_Justification), GACT_STRINGCENTER,
- (STRINGA_ExitHelp), TRUE,
- (GT_Underscore), '_',
- (TAG_END),
- };
-
-
- static void STRender(ULONG ScaleX, ULONG ScaleY, UWORD OffsetX, UWORD OffsetY)
- {
- NewList((struct List *) &TapeDriveList);
- TapeDriveListCount = 0;
-
- GT_SetGadgetAttrs(STGadgets[GDX_STTapeName],
- STWnd, NULL,
- GTST_String, TapeDsk.DOSName,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STDeviceName],
- STWnd, NULL,
- GTST_String, TapeDsk.DeviceName,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateProtocol],
- STWnd, NULL,
- GTCB_Checked, CreateProtocol,
- TAG_END);
-
- ClearTapeDrive();
-
- DrawBevelBox( STWnd->RPort, OffsetX + 220 * ScaleX/65535,
- OffsetY + 74 * ScaleY/65535,
- 269 * ScaleX/65535,
- 68 * ScaleY/65535,
- GT_VisualInfo, vi, GTBB_Recessed, TRUE, TAG_DONE );
- DrawBevelBox( STWnd->RPort, OffsetX + 4 * ScaleX/65535,
- OffsetY + 2 * ScaleY/65535,
- 491 * ScaleX/65535,
- 65 * ScaleY/65535,
- GT_VisualInfo, vi, GTBB_Recessed, TRUE, TAG_DONE );
- DrawBevelBox( STWnd->RPort, OffsetX + 4 * ScaleX/65535,
- OffsetY + 70 * ScaleY/65535,
- 491 * ScaleX/65535,
- 76 * ScaleY/65535,
- GT_VisualInfo, vi, GTBB_Recessed, TRUE, TAG_DONE );
- }
-
-
- static int OpenSTWindow(struct Window *Parent)
- {
- struct NewWindow NewSTWnd;
- struct Gadget *g;
- ULONG STScaleX, STScaleY;
- UWORD STOffX, STOffY;
- UWORD ww, wh;
- short n;
-
- NewSTWnd.LeftEdge = STLeft;
- NewSTWnd.TopEdge = STTop;
-
- TapeDskOk = FALSE;
-
- // default-Wert für BufMemType
- TapeDsk.DrvDat.BufMemType = DEFAULT_BUFMEMTYPE;
-
- strcpy(TapeDsk.DOSName, DEFAULT_TAPENAME);
-
- for (n=0; n<NDisk; n++)
- {
- if (Disks[n].TapeReq)
- {
- strcpy(TapeDsk.DOSName, Disks[n].DOSName);
- strcpy(TapeDsk.DeviceName, Disks[n].DeviceName);
- TapeDsk.Unit = Disks[n].Unit;
- break;
- }
- }
-
- CreateGadgetShort(&STGadgetShort);
-
- CalcGadgetScale(WBScreen, ScreenFont, &STScaleX, &STScaleY, &STOffX, &STOffY, 8, 11);
-
- ww = STWidth * STScaleX/65535;
- wh = STHeight * STScaleY/65535;
-
- g = CreateGadgetList(&STGList, ST_CNT,
- WBScreen->Font,
- STGTypes,
- STNGad,
- STGadgets,
- STGTags,
- STGadgetShort,
- &STResourceList,
- STScaleX, STScaleY,
- STOffX, STOffY
- );
-
- if (NULL == g)
- {
- alarm(GetString(MSG_CREATEGAD_FAILED), __FUNC__);
- return( 2L );
- }
-
- NewSTWnd.Width = ww + STOffX + WBScreen->WBorRight;
- NewSTWnd.Height = wh + STOffY + WBScreen->WBorBottom;
-
- // STWnd über dem Mauszeiger zentrieren
- CenterWindowMouse(Parent, &NewSTWnd);
-
- STWnd = OpenWindowTags( NULL,
- WA_Left, NewSTWnd.LeftEdge,
- WA_Top, NewSTWnd.TopEdge,
- WA_Width, NewSTWnd.Width,
- WA_Height, NewSTWnd.Height,
- WA_IDCMP, IDCMP_GADGETUP | BUTTONIDCMP | STRINGIDCMP | INTEGERIDCMP
- | TEXTIDCMP | IDCMP_MENUPICK | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY
- | IDCMP_ACTIVEWINDOW | IDCMP_VANILLAKEY | IDCMP_MENUHELP
- | IDCMP_REFRESHWINDOW | IDCMP_GADGETHELP,
- WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
- WA_Gadgets, STGList,
- WA_Title, GetString(MSG_STWINDOW_TITLE),
- WA_PubScreen, WBScreen,
- WA_AutoAdjust, TRUE,
- WA_HelpGroup, BackupHelpGroup,
- WA_MenuHelp, TRUE,
- WA_NewLookMenus, TRUE,
- TAG_DONE);
-
- if (STWnd == NULL)
- {
- alarm(GetString(MSG_CANNOT_OPEN_WINDOW), __FUNC__, "STWnd");
- return( 4L );
- }
-
- GT_RefreshWindow( STWnd, NULL );
-
- STRender(STScaleX, STScaleY, STOffX, STOffY);
-
- STInput = AddBInputHandler(1l << STWnd->UserPort->mp_SigBit, HandleSTMsg);
-
- return( 0L );
- }
-
-
- void CloseSTWindow( void )
- {
- RemBInputHandler(&STInput);
-
- if (STWnd)
- SafeCloseWindow(&STWnd);
-
- if (STGList)
- {
- FreeGadgets( STGList );
- STGList = NULL;
- }
-
- FreeBResources(&STResourceList);
- DestroyGadgetShort(&STGadgetShort);
- }
-
-
- void CleanupST(void)
- {
- CloseSTWindow();
- }
-
-
- BOOL SetupTape(struct Window *Parent, struct DiskFlags *UnknownDsk)
- {
- BOOL Result = TRUE;
-
- WindowBusy(Parent, TRUE);
-
- do {
- if (OpenSTWindow(Parent))
- break;
-
- if (UnknownDsk)
- {
- // Wenn UnknownDsk != NULL, dann wird gezielt das dort beschriebene Laufwerk untersucht
- strcpy(TapeDsk.DeviceName, UnknownDsk->DeviceName);
- TapeDsk.Unit = UnknownDsk->Unit;
- TapeDsk.DrvDat = UnknownDsk->DrvDat;
-
- WindowBusy(STWnd, TRUE);
- ScanSCSI(&TapeDsk);
-
- TapeDsk.Unit = UnknownDsk->Unit;
- GT_SetGadgetAttrs(STGadgets[GDX_STTapeDrives],
- STWnd, NULL,
- GTLV_Selected, TapeDsk.Unit,
- TAG_END);
-
- CheckTapeDrive(&TapeDsk);
- WindowBusy(STWnd, FALSE);
- }
-
- do {
- eingabe(0l);
- } while (STWnd);
- } while (0);
-
- WindowBusy(Parent, FALSE);
-
- return Result;
- }
-
-
- static int HandleSTMsg(void)
- {
- struct IntuiMessage *msg;
-
- while (STWnd && (msg = GT_GetIMsg(STWnd->UserPort)) )
- {
- ULONG class;
- USHORT code;
- APTR Address;
-
- class = msg->Class;
- code = msg->Code;
- Address = msg->IAddress;
-
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case IDCMP_ACTIVEWINDOW:
- activeWindow = STWnd;
- SetHelpPointer(activeWindow, HelpActive);
- break;
-
- case IDCMP_GADGETHELP:
- if (Address == NULL)
- {
- // Nicht über unserem Window
- }
- else if (Address == STWnd)
- {
- // über dem Window
- CallHelp(HELPID_STWindow, TRUE);
- }
- else
- CallHelp(((struct Gadget *) Address)->GadgetID, TRUE);
- break;
-
- case IDCMP_MENUHELP:
- break;
-
- case IDCMP_GADGETUP:
- HandleSTGadget((struct Gadget *) Address, code);
- break;
-
- case IDCMP_MENUPICK:
- break;
-
- case IDCMP_VANILLAKEY:
- HandleGadgetShort(STGadgetShort, STWnd, code, &STGadgetShortHook);
- break;
-
- case IDCMP_RAWKEY:
- d(printf("IDCMP_RAWKEY\n"));
- if (GADCODE_HELP == code)
- ToggleHelp();
- break;
-
- case IDCMP_CHANGEWINDOW:
- STLeft = STWnd->LeftEdge;
- STTop = STWnd->TopEdge;
- break;
- }
- }
- return 0;
- }
-
-
- static void __interrupt HandleSTGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code)
- {
- HandleSTGadget(Gad, (USHORT) *Code);
- }
-
-
- static void HandleSTGadget(struct Gadget *Gad, USHORT code)
- {
- char DeviceName[DEVICENAME_SIZE];
- char AcceptPattern[40];
-
- switch (Gad->GadgetID)
- {
- case GD_STUse:
- CloseSTWindow();
- UseSTData(&TapeDsk);
- break;
-
- case GD_STCancel:
- CloseSTWindow();
- break;
-
- case GD_STScanSCSI:
- GT_SetGadgetAttrs(STGadgets[GDX_STTestDrive],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- stccpy(TapeDsk.DeviceName, GADSTRING(STGadgets[GDX_STDeviceName]), sizeof(TapeDsk.DeviceName));
- WindowBusy(STWnd, TRUE);
- ScanSCSI(&TapeDsk);
- WindowBusy(STWnd, FALSE);
- break;
-
- case GD_STTapeDrives:
- TapeDsk.Unit = TapeDriveNodes[code].ln_Pri;
-
- WindowBusy(STWnd, TRUE);
- FindDsk(TapeDsk.DeviceName, TapeDsk.Unit);
- CheckTapeDrive(&TapeDsk);
- WindowBusy(STWnd, FALSE);
- break;
-
- case GD_STMount:
- MountTapeDrive(&TapeDsk);
- break;
-
- case GD_STCreateMount:
- CreateMountFile(&TapeDsk);
- break;
-
- case GD_STTestDrive:
- TestDrive(&TapeDsk);
- break;
-
- case GD_STDeviceFile:
- ParsePatternNoCase((STRPTR) "#?.device", AcceptPattern, sizeof(AcceptPattern));
-
- if (StdFile(STWnd, GetString(MSG_SELECT_DEVICE),
- "", DeviceName, sizeof(DeviceName),
- ASLFR_InitialDrawer, "DEVS:",
- ASLFR_InitialFile, TapeDsk.DeviceName,
- ASLFR_RejectIcons, TRUE,
- ASLFR_AcceptPattern, AcceptPattern,
- TAG_END))
- {
- GT_SetGadgetAttrs(STGadgets[GDX_STTestDrive],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
-
- stccpy(TapeDsk.DeviceName, FilePart(DeviceName), sizeof(TapeDsk.DeviceName));
-
- GT_SetGadgetAttrs(STGadgets[GDX_STDeviceName],
- STWnd, NULL,
- GTST_String, TapeDsk.DeviceName,
- TAG_END);
- }
- break;
-
- case GD_STCreateProtocol:
- CreateProtocol = code;
- break;
- }
- }
-
-
- static void UseSTData(struct DiskFlags *Dsk)
- {
- struct TapeDriveProperties DD;
-
- DD.Properties = Dsk->DrvDat.Properties;
- stccpy(DD.Name, &Dsk->DrvDat.InquiryData[8], sizeof(DD.Name));
-
- WriteTapeDriveDataBase(&DD);
- }
-
-
- static void ScanSCSI(struct DiskFlags *Dsk)
- {
- ClearTapeDrive();
-
- NewList((struct List *) &TapeDriveList);
- TapeDriveListCount = 0;
- TapeDskOk = FALSE;
-
- for (Dsk->Unit=0; Dsk->Unit<=7; Dsk->Unit++)
- {
- struct IOExtTD *TapeReq;
-
- STMessageText(NULL, MSG_CHECKING_SCSI_UNIT, Dsk->Unit);
-
- TapeReq = OpenDisk(Dsk, FALSE);
- if (TapeReq)
- {
- Dsk->diskreq = TapeReq;
- Dsk->TapeReq = AllocVec(sizeof(struct TapeIO), Dsk->DrvDat.BufMemType);
- if (NULL == Dsk->TapeReq)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "TapeReq", sizeof(struct TapeIO));
- return;
- }
- Dsk->TapeReq->DrvDat = &Dsk->DrvDat;
- Dsk->TapeReq->Req = Dsk->diskreq;
-
- if (0 == TapeInquiry(Dsk->TapeReq))
- {
- if (DG_SEQUENTIAL_ACCESS == (Dsk->DrvDat.InquiryData[0] & 0x1f))
- {
- GT_SetGadgetAttrs(STGadgets[GDX_STTapeDrives],
- STWnd, NULL,
- GTLV_Labels, ~0,
- GTLV_Selected, ~0,
- TAG_END);
-
- sprintf(TapeDriveNames[TapeDriveListCount],
- "%d: %28.28s", Dsk->Unit, &Dsk->DrvDat.InquiryData[8]);
- TapeDriveNodes[TapeDriveListCount].ln_Name = TapeDriveNames[TapeDriveListCount];
- TapeDriveNodes[TapeDriveListCount].ln_Type = NT_USER;
- TapeDriveNodes[TapeDriveListCount].ln_Pri = Dsk->Unit;
- AddTail((struct List *) &TapeDriveList, &TapeDriveNodes[TapeDriveListCount]);
-
- TapeDriveListCount++;
-
- GT_SetGadgetAttrs(STGadgets[GDX_STTapeDrives],
- STWnd, NULL,
- GTLV_Labels, &TapeDriveList,
- GTLV_Selected, ~0,
- TAG_END);
- }
- }
-
- FreeVec(Dsk->TapeReq);
- Dsk->TapeReq = NULL;
-
- CloseDisk(Dsk, CDP_KeepTape);
- }
- }
-
- STMessageText("", 0);
- }
-
-
- static void CheckTapeDrive(struct DiskFlags *Dsk)
- {
- struct IOExtTD *TapeReq;
-
- GT_SetGadgetAttrs(STGadgets[GDX_STUse],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STTapeName],
- STWnd, NULL,
- GTST_String, TapeDsk.DOSName,
- TAG_END);
-
- TapeReq = OpenDisk(Dsk, TRUE);
- if (TapeReq)
- {
- Dsk->diskreq = TapeReq;
- Dsk->TapeReq = AllocVec(sizeof(struct TapeIO), Dsk->DrvDat.BufMemType);
- if (NULL == Dsk->TapeReq)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "TapeReq", sizeof(struct TapeIO));
- return;
- }
- Dsk->TapeReq->DrvDat = &Dsk->DrvDat;
- Dsk->TapeReq->Req = Dsk->diskreq;
-
- if (0 == TapeInquiry(Dsk->TapeReq))
- {
- WindowBusy(STWnd, TRUE);
- TapeCheckDriveProperties(Dsk);
- WindowBusy(STWnd, FALSE);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STSCSI2],
- STWnd, NULL,
- GTCB_Checked, 2 == (Dsk->DrvDat.InquiryData[2] & 0x07),
- TAG_END);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STPageFormat],
- STWnd, NULL,
- GTCB_Checked, Dsk->DrvDat.Properties.PageFormat,
- TAG_END);
-
- stccpy(ProductName, &Dsk->DrvDat.InquiryData[16], 16+1);
- GT_SetGadgetAttrs(STGadgets[GDX_STModel],
- STWnd, NULL,
- GTTX_Text, ProductName,
- TAG_END);
-
- stccpy(VendorName, &Dsk->DrvDat.InquiryData[8], 8+1);
- GT_SetGadgetAttrs(STGadgets[GDX_STVendor],
- STWnd, NULL,
- GTTX_Text, VendorName,
- TAG_END);
-
- stccpy(RevisionName, &Dsk->DrvDat.InquiryData[32], 4+1);
- GT_SetGadgetAttrs(STGadgets[GDX_STRevision],
- STWnd, NULL,
- GTTX_Text, RevisionName,
- TAG_END);
-
- // USE freigeben wenn Laufwerk bekannt ist
- GT_SetGadgetAttrs(STGadgets[GDX_STUse],
- STWnd, NULL,
- GA_Disabled, !Dsk->DrvDat.Properties.DriveKnown,
- TAG_END);
-
- // Create Mountlist freigeben wenn Laufwerk bekannt ist
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateMount],
- STWnd, NULL,
- GA_Disabled, !Dsk->DrvDat.Properties.DriveKnown,
- TAG_END);
-
- // MOUNT freigeben wenn Laufwerk bekannt ist
- GT_SetGadgetAttrs(STGadgets[GDX_STMount],
- STWnd, NULL,
- GA_Disabled, !Dsk->DrvDat.Properties.DriveKnown,
- TAG_END);
-
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- }
-
- FreeVec(Dsk->TapeReq);
- Dsk->TapeReq = NULL;
-
- CloseDisk(Dsk, CDP_KeepTape);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STTestDrive],
- STWnd, NULL,
- GA_Disabled, FALSE,
- TAG_END);
- }
- }
-
-
- static void TestDrive(struct DiskFlags *Dsk)
- {
- struct IOExtTD *TapeReq;
-
- TapeReq = OpenDisk(Dsk, TRUE);
- if (TapeReq)
- {
- const char *Prompt;
-
- Dsk->diskreq = TapeReq;
- Dsk->TapeReq = AllocVec(sizeof(struct TapeIO), Dsk->DrvDat.BufMemType);
- if (NULL == Dsk->TapeReq)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "TapeReq", sizeof(struct TapeIO));
- return;
- }
- Dsk->TapeReq->DrvDat = &Dsk->DrvDat;
- Dsk->TapeReq->Req = Dsk->diskreq;
-
- WindowBusy(STWnd, TRUE);
- TapeCheckDriveProperties(Dsk);
- WindowBusy(STWnd, FALSE);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STSCSI2],
- STWnd, NULL,
- GTCB_Checked, 2 == (Dsk->DrvDat.InquiryData[2] & 0x07),
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STPageFormat],
- STWnd, NULL,
- GTCB_Checked, 2 == (Dsk->DrvDat.InquiryData[2] & 0x07),
- TAG_END);
-
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
-
- TapeInitDrive(Dsk->TapeReq, Dsk);
-
- WindowBusy(STWnd, TRUE);
- TapeTryLoadUnLoad(Dsk->TapeReq, TRUE);
- WindowBusy(STWnd, FALSE);
-
- Prompt = GetString(TapeChangeState(Dsk->TapeReq) ? MSG_BEGINTEST_NOTAPE_PROMPT : MSG_BEGINTEST_PROMPT);
-
- if (yesno(STWnd, Prompt) == *GetString(MSG_YES_SHORT))
- {
- BOOL TestReady;
-
- WindowBusy(STWnd, TRUE);
- TestReady = DoTestTapeDrive(Dsk);
- WindowBusy(STWnd, FALSE);
-
- if (TestReady)
- {
- // "Use" Gadget einschalten wenn Test erfolgreich beendet.
- GT_SetGadgetAttrs(STGadgets[GDX_STUse],
- STWnd, NULL,
- GA_Disabled, FALSE,
- TAG_END);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateMount],
- STWnd, NULL,
- GA_Disabled, FALSE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STMount],
- STWnd, NULL,
- GA_Disabled, FALSE,
- TAG_END);
- // "Test Drive" ausschalten
- GT_SetGadgetAttrs(STGadgets[GDX_STTestDrive],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- }
- }
-
- STMessageText(NULL, MSG_UNLOADING_TAPE);
- WindowBusy(STWnd, TRUE);
- TapeTryLoadUnLoad(Dsk->TapeReq, FALSE);
- WindowBusy(STWnd, FALSE);
-
- STMessageText("", 0);
-
- FreeVec(Dsk->TapeReq);
- Dsk->TapeReq = NULL;
-
- CloseDisk(Dsk, CDP_KeepTape);
- }
- }
-
-
- static void ClearTapeDrive(void)
- {
- GT_SetGadgetAttrs(STGadgets[GDX_STUse],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STCreateMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STMount],
- STWnd, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STTapeDrives],
- STWnd, NULL,
- GTLV_Selected, ~0,
- GTLV_Labels, ~0,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STSCSI2],
- STWnd, NULL,
- GTCB_Checked, FALSE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STPageFormat],
- STWnd, NULL,
- GTCB_Checked, FALSE,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STModel],
- STWnd, NULL,
- GTTX_Text, "",
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STVendor],
- STWnd, NULL,
- GTTX_Text, "",
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STRevision],
- STWnd, NULL,
- GTTX_Text, "",
- TAG_END);
- }
-
-
-
- static void SetPropertyGadgets(const struct TapeFlags *Prop)
- {
- GT_SetGadgetAttrs(STGadgets[GDX_STQFA],
- STWnd, NULL,
- GTCB_Checked, Prop->canQFA,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STFastSpace],
- STWnd, NULL,
- GTCB_Checked, Prop->FastSpace,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STLocate],
- STWnd, NULL,
- GTCB_Checked, Prop->canLocate,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STSpaceBack],
- STWnd, NULL,
- GTCB_Checked, Prop->SpaceBack,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STInvertEOT],
- STWnd, NULL,
- GTCB_Checked, Prop->InvertEOT,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STEraseLong],
- STWnd, NULL,
- GTCB_Checked, Prop->EraseLONG,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STQFAAppend],
- STWnd, NULL,
- GTCB_Checked, Prop->AppendQFA,
- TAG_END);
- GT_SetGadgetAttrs(STGadgets[GDX_STSpaceEOR],
- STWnd, NULL,
- GTCB_Checked, Prop->SpaceEOR,
- TAG_END);
- }
-
-
- static void STMessageText(const char *Text, ULONG MsgID, ...)
- {
- char Line[120];
- va_list args;
-
- va_start(args, MsgID);
-
- if (NULL == STWnd)
- return;
-
- if (NULL == Text)
- Text = GetString(MsgID);
-
- vsprintf(Line, Text, args);
-
- GT_SetGadgetAttrs(STGadgets[GDX_STMessages],
- STWnd, NULL,
- GTTX_Text, Line,
- TAG_END);
-
- va_end(args);
- }
-
-
- static char *DecodeTapeError(struct DiskFlags *Dsk, char *Line)
- {
- static const long SKMessages[] =
- {
- MSG_SK_NOSENSE, MSG_SK_RECOVEREDERROR, MSG_SK_NOTREADY, MSG_SK_MEDIUMERROR,
- MSG_SK_HARDWAREERROR, MSG_SK_ILLEGALREQUEST, MSG_SK_UNITATTENTION, MSG_SK_DATAPROTECT,
- MSG_SK_BLANKCHECK, MSG_SK_VENDORSPECIFIC, MSG_SK_COPYABORTED,
- MSG_SK_ABORTEDCOMMAND, MSG_SK_EQUAL, MSG_SK_VOLUMEOVERFLOW, MSG_SK_MISCOMPARE,
- MSG_SK_RESERVED
- };
- unsigned char SenseKey, ASC, ASCQ;
-
- SenseKey = Dsk->TapeReq->Sense[2] & 0x0f;
- ASC = Dsk->TapeReq->Cmd.scsi_SenseLength > 12 ? Dsk->TapeReq->Sense[12] : 0;
- ASCQ = Dsk->TapeReq->Cmd.scsi_SenseLength > 13 ? Dsk->TapeReq->Sense[13] : 0;
-
- sprintf(Line, GetString(MSG_TAPE_ERRMSG),
- Dsk->TapeReq->Cmd.scsi_Status,
- Dsk->TapeReq->Sense[2], GetString(SKMessages[SenseKey]),
- ASC, ASCQ
- );
-
- return Line;
- }
-
-
- static BOOL DoTestTapeDrive(struct DiskFlags *Dsk)
- {
- unsigned long MaxBlock, MinBlock;
- unsigned char *DataBlock;
- char Line[120];
- short Result, n;
-
- if (TapeChangeState(Dsk->TapeReq))
- {
- // kein Band im Laufwerk
- return FALSE;
- }
-
- if (0 != TapeProtStatus(Dsk->TapeReq))
- {
- // Pech gehabt - Band ist schreibgeschützt
- alarm(GetString(MSG_TAPE_WRITEPROTECTED));
- return FALSE;
- }
-
- // ggf. ProtFile zu diesem Band löschen
- CheckOldProtFile(Dsk);
-
- // QFA testen
- STMessageText(NULL, MSG_QFA_PROGRESS);
- Dsk->DrvDat.Properties.canQFA = 1;
- Result = TapeInitQFA(Dsk->TapeReq, TRUE);
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info,
- GetString(MSG_QFA_RESULT),
- Result ? DecodeTapeError(Dsk, Line) : GetString(MSG_STRESULT_OK));
- }
- STMessageText(NULL, MSG_QFA_RESULT,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
-
-
- // ERASE long/short testen
- // zuerst ERASE SHORT versuchen
- STMessageText(NULL, MSG_ERASE_PROGRESS, "");
- Dsk->DrvDat.Properties.EraseLONG = 0;
- Result = TapeErase(Dsk->TapeReq);
- if (Result)
- {
- // ERASE SHORT hat nicht geklappt
- // jetzt mit ERASE LONG versuchen
- if (CreateProtocol)
- PostError(TRUE, MSGPRI_Info, GetString(MSG_ERASESHORT_FAIL), DecodeTapeError(Dsk, Line));
- }
- if (!Result)
- TapeProtStatus(Dsk->TapeReq); // warten bis ERASE fertig
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_ERASE_RESULT),
- Dsk->DrvDat.Properties.EraseLONG ? "LONG" : "",
- Result ? DecodeTapeError(Dsk, Line) : GetString(MSG_STRESULT_OK));
- }
- STMessageText(NULL, MSG_ERASE_RESULT,
- Dsk->DrvDat.Properties.EraseLONG ? "LONG" : "",
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
-
-
- STMessageText(NULL, MSG_REWINDING);
- TapeRewind(Dsk->TapeReq);
-
- // Blocklänge festlegen (ideal: 512 Bytes)
- Result = TapeReadBlockLimits(Dsk->TapeReq, &MinBlock, &MaxBlock);
- if (0 == Result)
- {
- if (CreateProtocol)
- PostError(TRUE, MSGPRI_Info, GetString(MSG_READBLOCKLIMITS_OK), MinBlock, MaxBlock);
-
- Dsk->DrvDat.BlockSize = MaxBlock > 512ul ? 512ul : MaxBlock;
- Dsk->DrvDat.BlockSize = Dsk->DrvDat.BlockSize > MinBlock ? Dsk->DrvDat.BlockSize : MinBlock;
- }
- else
- {
- if (CreateProtocol)
- PostError(TRUE, MSGPRI_Info, GetString(MSG_READBLOCKLIMITS_FAIL), DecodeTapeError(Dsk, Line));
- Dsk->DrvDat.BlockSize = 512l;
- }
-
- STMessageText(NULL, MSG_BLOCKSIZE_SELECTED, Dsk->DrvDat.BlockSize);
-
- DataBlock = AllocVec(Dsk->DrvDat.BlockSize, Dsk->DrvDat.BufMemType);
- if (NULL == DataBlock)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "DataBlock", Dsk->DrvDat.BlockSize);
- return FALSE;
- }
-
-
- STMessageText(NULL, MSG_WRITING_BLOCKS, TESTBLOCK_COUNT);
- for (n=Result=0; !Result && n<TESTBLOCK_COUNT; n++)
- {
- memset(DataBlock, n, Dsk->DrvDat.BlockSize);
- Result = TapeWrite(Dsk->TapeReq, DataBlock, Dsk->DrvDat.BlockSize);
- if (Result && CreateProtocol)
- PostError(TRUE, MSGPRI_Info, GetString(MSG_TAPEWRITE_FAIL), DecodeTapeError(Dsk, Line));
- }
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_TAPEWRITE_RESULT), n, TESTBLOCK_COUNT,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- }
- STMessageText(NULL, MSG_TAPEWRITE_RESULT, n, TESTBLOCK_COUNT,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
-
-
- // Result = WriteFileMarks(Dsk->TapeReq, 1, FALSE);
-
- STMessageText(NULL, MSG_REWINDING);
- TapeRewind(Dsk->TapeReq);
-
-
- Dsk->DrvDat.Properties.SpaceEOR = 1;
- STMessageText(NULL, MSG_SPACE_EOR_PROGRESS);
- Result = TapeSpace(Dsk->TapeReq, 0, 3);
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_SPACE_EOR_RESULT),
- Result ? DecodeTapeError(Dsk, Line) : GetString(MSG_STRESULT_OK));
- }
- if (Result)
- Dsk->DrvDat.Properties.SpaceEOR = 0;
- STMessageText(NULL, MSG_SPACE_EOR_RESULT,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
-
-
- if (!Dsk->DrvDat.Properties.SpaceEOR)
- {
- // Band auf Block 50 stellen wenn "Space To End Of Recording" nicht geklappt hat
- // damit "Space Back" probiert werden kann!
- TapeRewind(Dsk->TapeReq);
- TapeSpace(Dsk->TapeReq, 50, 0);
- }
-
-
- // SPACE Backwards testen
- STMessageText(NULL, MSG_SPACEBACK_PROGRESS, 5);
- Dsk->DrvDat.Properties.SpaceBack = 1;
- Result = TapeSpace(Dsk->TapeReq, -5, 0);
- if (Result)
- Dsk->DrvDat.Properties.SpaceBack = 0;
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_SPACEBACK_RESULT), 5,
- Result ? DecodeTapeError(Dsk, Line) : GetString(MSG_STRESULT_OK));
- }
- STMessageText(NULL, MSG_SPACEBACK_RESULT, 5,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
-
-
- STMessageText(NULL, MSG_REWINDING);
- TapeRewind(Dsk->TapeReq);
-
-
- STMessageText(NULL, MSG_LOCATE_PROGRESS, TESTBLOCK_COUNT/2);
- Dsk->DrvDat.Properties.canLocate = 1;
- Result = TapeLocate(Dsk->TapeReq, 50);
- if (Result)
- Dsk->DrvDat.Properties.canLocate = 0;
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_LOCATE_RESULT), TESTBLOCK_COUNT/2,
- Result ? DecodeTapeError(Dsk, Line) : GetString(MSG_STRESULT_OK));
- }
- STMessageText(NULL, MSG_LOCATE_RESULT, TESTBLOCK_COUNT/2,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
-
-
- // Testen ob QFA bei Append klappt
- if (Dsk->DrvDat.Properties.canQFA && Dsk->DrvDat.Properties.SpaceEOR)
- {
- Dsk->DrvDat.Properties.AppendQFA = 1;
-
- STMessageText(NULL, MSG_QFAAPPEND_PROGRESS);
- Result = TestQFAAppend(Dsk, DataBlock);
- STMessageText(NULL, MSG_QFAAPPEND_RESULT,
- Result ? GetString(MSG_STRESULT_FAIL) : GetString(MSG_STRESULT_OK));
- if (Result)
- Dsk->DrvDat.Properties.AppendQFA = 0;
-
- if (CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_QFAAPPEND_RESULT),
- Result ? DecodeTapeError(Dsk, Line) : GetString(MSG_STRESULT_OK));
- }
-
- SetPropertyGadgets(&Dsk->DrvDat.Properties);
- Delay(100);
- }
-
-
- if (DataBlock)
- FreeVec(DataBlock);
-
- return TRUE;
- }
-
-
- static long TestQFAAppend(struct DiskFlags *Dsk, unsigned char *DataBlock)
- {
- char Line[120];
- long Error;
-
- TapeRewind(Dsk->TapeReq);
-
- Error = TapeSpace(Dsk->TapeReq, 0, 3); // Space To End Of Recording
- if (Error)
- return Error;
-
- memset(DataBlock, 0xaa, Dsk->DrvDat.BlockSize);
- Error = TapeWrite(Dsk->TapeReq, DataBlock, Dsk->DrvDat.BlockSize);
- if (Error && CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_TAPEAPPENDWRITE_RESULT), DecodeTapeError(Dsk, Line));
- return Error;
- }
-
- TapeRewind(Dsk->TapeReq);
-
- Error = TapeSetDirectoryPartition(Dsk->TapeReq);
- if (Error && CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_CHANGEPARTITION_RESULT), DecodeTapeError(Dsk, Line));
- return Error;
- }
-
- // jetzt einen Block in die Directory Partition schreiben
- memset(DataBlock, 0x55, Dsk->DrvDat.BlockSize);
- Error = TapeWrite(Dsk->TapeReq, DataBlock, Dsk->DrvDat.BlockSize);
- if (Error && CreateProtocol)
- {
- PostError(TRUE, MSGPRI_Info, GetString(MSG_TAPEAPPENDWRITEQFA_FAIL), DecodeTapeError(Dsk, Line));
- return Error;
- }
-
- TapeRewind(Dsk->TapeReq);
- TapeSetDataPartition(Dsk->TapeReq);
-
- return 0;
- }
-
-
- static BOOL CreateMountFile(struct DiskFlags *Dsk)
- {
- BOOL is21;
- const char *OpenMode;
- FILE *fd;
- char FileName[FMSIZE];
-
- is21 = SysBase->LibNode.lib_Version > 36;
-
- if (is21)
- {
- char *InitialFileName;
- short ynResult;
-
- InitialFileName = GADSTRING(STGadgets[GDX_STTapeName]);
-
- do {
- // Filename erfragen
- if (!StdFile(STWnd, GetString(MSG_MOUNTFILENAME_ASK), InitialFileName,
- FileName, sizeof(FileName),
- ASLFR_DoSaveMode, TRUE,
- ASLFR_RejectIcons, TRUE,
- ASLFR_DoPatterns, TRUE,
- TAG_END))
- {
- return FALSE;
- }
-
- OpenMode = "w";
-
- if (0 == access(FileName, F_OK))
- {
- // wenn es dieses File schon gibt: nachfragen!
- ynResult = yesno(STWnd, GetString(MSG_REPLACE_MOUNTFILE), FileName);
- }
- else
- {
- ynResult = *GetString(MSG_YES_SHORT);
- }
- } while (ynResult != *GetString(MSG_YES_SHORT));
- }
- else
- {
- stccpy(FileName, "DEVS:MountList", sizeof(FileName));
- OpenMode = "a";
- }
-
- fd = fopen(FileName, OpenMode);
- if (fd)
- WriteMountList(fd, Dsk);
- else
- alarm(GetString(MSG_CANNOT_OPENFILE), Dsk->DOSName, GetIoErrText());
- }
-
-
- static BOOL WriteMountList(FILE *fd, const struct DiskFlags *Dsk)
- {
- BOOL is21;
-
- is21 = SysBase->LibNode.lib_Version > 36;
-
- fputs("/* Backup & Restore Tape mount entry under 2.1 */\n", fd);
- fputs("\n", fd);
- fputs("/* Wichtig sind nur Name, \"Device\", \"Unit\", \"Flags\", \"Mask\" und \"BufMemType\" */\n", fd);
- fputs("\n", fd);
- if (!is21)
- fprintf(fd, "%s:", Dsk->DOSName);
-
- fprintf(fd, " Device = %s\n", Dsk->DeviceName);
- fprintf(fd, " Unit = %ld", Dsk->Unit);
- fprintf(fd, " Flags = %ld\n", Dsk->DrvDat.Flags);
- fprintf(fd, " GlobVec = %ld\n", -1);
- fprintf(fd, " DosType = 0x%08lx\n", MAKE_ID('T','A','P','\0'));
- fprintf(fd, " BufMemType = %ld\n", Dsk->DrvDat.BufMemType);
- fprintf(fd, " Mask = 0x%08lx\n", ~0);
- fprintf(fd, " Activate = %ld\n", 0);
-
- if (!is21)
- fputs("#\n\n", fd);
- else
- fclose(fd);
-
- return TRUE;
- }
-
-
- static BOOL MountTapeDrive(struct DiskFlags *Dsk)
- {
- struct DosList *Device;
- struct DosList *dlist;
- struct FileSysStartupMsg *StartupMsg;
- struct DosEnvec *Env;
- char *Allocated, *AllPtr;
- char *DevName;
-
- if (NULL == Dsk)
- return FALSE;
-
- AllPtr = Allocated = AllocMem(strlen(Dsk->DeviceName) + 1 +
- sizeof(struct DosEnvec) + sizeof(struct FileSysStartupMsg),
- MEMF_PUBLIC|MEMF_CLEAR);
- if (NULL == Allocated)
- return FALSE;
-
- DevName = AllPtr;
- strcpy(DevName, Dsk->DeviceName);
- AllPtr += strlen(Dsk->DeviceName) + 1;
-
- Env = (struct DosEnvec *) AllPtr;
- AllPtr += sizeof(*Env);
-
- StartupMsg = (struct FileSysStartupMsg *) AllPtr;
-
- while(1)
- {
- dlist = AttemptLockDosList(LDF_DEVICES|LDF_WRITE);
- // Account for DOS bug in V39 which may cause AttemptLockDosList
- // to return 1 instead of NULL
- if (dlist != NULL && dlist != (struct DosList *) 1)
- break;
- // Can't lock the DOS list. Wait a second and try again.
- Delay(50);
- }
- Device = FindDosEntry(dlist, Dsk->DOSName, LDF_DEVICES);
-
- if (Device)
- RemDosEntry(Device);
-
- UnLockDosList(LDF_DEVICES|LDF_WRITE);
-
- if(!Device && !(Device = MakeDosEntry(Dsk->DOSName, DLT_DEVICE)))
- {
- return FALSE;
- }
-
- Env->de_TableSize = DE_MASK;
- Env->de_SizeBlock = 512 / sizeof(long); // in longwords: standard value is 128
- Env->de_SecOrg = 0; // not used; must be 0
- Env->de_Surfaces = 1; // # of heads (surfaces). drive specific
- Env->de_SectorPerBlock = 1; // not used; must be 1
- Env->de_BlocksPerTrack = 1; // blocks per track. drive specific
- Env->de_Reserved = 0; // DOS reserved blocks at start of partition.
- Env->de_PreAlloc = 0; // DOS reserved blocks at end of partition
- Env->de_Interleave = 0; // usually 0
- Env->de_LowCyl = 0; // starting cylinder. typically 0
- Env->de_HighCyl = 1; // max cylinder. drive specific
- Env->de_NumBuffers = 10; // Initial # DOS of buffers.
- Env->de_BufMemType = Dsk->DrvDat.BufMemType; // type of mem to allocate for buffers
- Env->de_MaxTransfer = 0x00ffffff; // Max number of bytes to transfer at a time
- Env->de_Mask = ~0; // Address Mask to block out certain memory
-
- StartupMsg->fssm_Unit = Dsk->Unit;
- StartupMsg->fssm_Device = MKBADDR(DevName);
- StartupMsg->fssm_Environ = MKBADDR(Env);
- StartupMsg->fssm_Flags = Dsk->DrvDat.Flags;
-
- Device->dol_misc.dol_handler.dol_Handler = NULL;
- Device->dol_misc.dol_handler.dol_StackSize = 8192;
- Device->dol_misc.dol_handler.dol_Priority = 0;
- Device->dol_misc.dol_handler.dol_Startup = MKBADDR(StartupMsg);
- Device->dol_misc.dol_handler.dol_SegList = NULL;
- Device->dol_misc.dol_handler.dol_GlobVec = (BPTR) -1;
-
- // Now we can own the volume by giving it our msgport
- Device->dol_Task = NULL;
-
- while (1)
- {
- dlist = AttemptLockDosList(LDF_DEVICES|LDF_WRITE);
- // Account for DOS bug in V39 which may cause AttemptLockDosList
- // to return 1 instead of NULL
- if(dlist != NULL && dlist != (struct DosList *)1)
- break;
- // Oops, can't lock DOS list. Wait 1 second and retry.
- Delay(50);
- }
- AddDosEntry(Device);
- UnLockDosList(LDF_DEVICES|LDF_WRITE);
-
- return TRUE;
- }
-
-
- static void FindDsk(const char *Device, short Unit)
- {
- short n;
-
- for (n=0; n<NDisk; n++)
- {
- if (Disks[n].TapeReq && Unit == Disks[n].Unit && 0 == stricmp(Device, Disks[n].DeviceName))
- {
- strcpy(TapeDsk.DOSName, Disks[n].DOSName);
- break;
- }
- }
- }
-